package com.biostime.terminal.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdom.Element;

public class Properties extends BaseElement {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8628606611139913489L;
	private static Log log = LogFactory.getLog(Properties.class);

	/**
	 * @return 返回当前XML节点的Element对象
	 */
	public Element toElement() {
		Element prop = new Element("properties");
		for (int i = 0; i < getElements().size(); i++) {
			prop.addContent(((BaseElement) getElements().get(i)).toElement());
		}
		return prop;
	}

	/**
	 * @return 返回当前XML节点的String对象，用于测试验证
	 */
	public String toString() {
		log.debug("[properties]");
		return XMLWriter.writeString(toElement());
	}

	public boolean addElement(BaseElement baseXmlElement) {
		getElements().addElement(baseXmlElement);
		return true;
	}

	public boolean delElement(BaseElement baseXmlElement) {
		if (getElements().size() != 0) {
			return getElements().removeElement(baseXmlElement);
		}
		return false;
	}

	public Cell[] getCells() {
		return (Cell[]) getElements().toArray(new Cell[0]);
	}

	/**
	 * 根据传入参数，在Properties之下查找与之匹配的名字属性的第一个Cell元素，并返回它的值。 若找不到，则抛出异常。
	 * 
	 * @param name
	 *            待查找的Cell元素的名字属性
	 * @return Cell元素的值属性
	 * @throws NoSuchFieldException
	 *             若找不到指定名字的属性
	 */
	public String getCellValueByName(String name) throws NoSuchFieldException {
		String retVal = "";
		for (int i = 0; i < getElements().size(); i++) {
			Cell c = (Cell) getElements().get(i);
			if (c.getName().equals(name)) {
				retVal = c.getValue();
				return retVal;
			}
		}
		throw new NoSuchFieldException("找不到名字为'" + name + "'的值");
	}

	/**
	 * 在Properties之下查找与之匹配的名字属性的第一个Cell元素，并返回它的值。 若找不到，则返回指定的默认值。
	 * 
	 * @param name
	 *            待查找的Cell元素的名字属性
	 * @param def
	 *            默认值
	 * @return Cell元素的值属性
	 */
	public String getCellValueWithDefault(String name, String def) {
		String val = def;
		for (int i = 0; i < getElements().size(); i++) {
			Cell c = (Cell) getElements().get(i);
			if (c.getName().equals(name)) {
				val = c.getValue();
				break;
			}
		}
		return val;
	}

}
